//+------------------------------------------------------------------+ //| [ea]SimpleTMTv0.1.mq4 | //| Bart Pekala | //| | //+------------------------------------------------------------------+ #property copyright "Bart Pekala" #property link "bart.pekala@gmail.com" #include extern string WhenToTrade ="12:00"; extern string TypeString0 ="// TypeOfOrder:"; extern string TypeString1 ="// 0 = market buy; 1 = market sell"; extern string TypeString2 ="// 2 = buy limit; 3 = sell limit"; extern string TypeString3 ="// 4 = buy stop; 5 = sell stop"; extern int TypeOfOrder =0; extern double Lots =0.1; extern int MaxSlippagePips =3; extern int MaxDelayMinutes =3; extern string PriceString ="// entry price (pending orders only):"; extern double EntryPrice =0.0; extern int SLDistancePips =100; extern int TPDistancePips =100; extern string virString1 ="// VirginityFilter: don\'t send order..."; extern string virString2 ="// if the level\'s been breached (pending only)"; extern bool UseVirginityFilter=false; extern int EAMagicNumber =111009; datetime tradingTime =0; int orderSendDay =0; bool needToModify =false; double maxSinceInit =0; double minSinceInit =0; int dayOfMonth; int minsToNextTrade; datetime now; int ticket; bool result; string chartSymbol; double entry; double sl; double tp; double oop; //+------------------------------------------------------------------+ //| expert initialization function | //+------------------------------------------------------------------+ int init() { //---- if(MaxDelayMinutes < 1) MaxDelayMinutes= 1; //it has to be at least 1 chartSymbol =Symbol(); start(); //---- return(0); } //+------------------------------------------------------------------+ //| expert deinitialization function | //+------------------------------------------------------------------+ int deinit() { //---- Comment(""); //---- return(0); } //+------------------------------------------------------------------+ //| expert start function | //+------------------------------------------------------------------+ int start() { //---- now =TimeCurrent(); tradingTime =StrToTime(WhenToTrade); if(now > tradingTime+MaxDelayMinutes*60) tradingTime+=(PERIOD_D1*60); minsToNextTrade=((tradingTime-now)/60); Comment("SimpleTMT - time to next trade: ",minsToNextTrade," minutes"); dayOfMonth =Day(); UpdateMinMax(); if(now < tradingTime) {return(0);} //not yet... if(now > tradingTime+MaxDelayMinutes*60) {return(0);} //too late... if(UseVirginityFilter && TypeOfOrder > 1 && !IsAVirgin(EntryPrice)) { Print("level breached; not sending orders"); return(0); } if(orderSendDay != dayOfMonth) //didn't we already trade? { entry =GetEntryPrice(); //sending order... ticket = OrderSend("EURJPY",OP_SELL, Lot, MarketInfo("EURJPY",MODE_BID), 2, NULL, NULL, NULL, 0, 0, CLR_NONE); OrderSend("GBPUSD",OP_SELL, Lot, MarketInfo("GBPUSD",MODE_BID), 2, NULL, NULL, NULL, 0, 0, CLR_NONE); OrderSend("EURGBP",OP_SELL, Lot, MarketInfo("EURGBP",MODE_BID), 2, NULL, NULL, NULL, 0, 0, CLR_NONE); OrderSend("GBPCHF",OP_SELL, Lot, MarketInfo("GBPCHF",MODE_BID), 2, NULL, NULL, NULL, 0, 0, CLR_NONE); OrderSend("CHFJPY",OP_SELL, Lot, MarketInfo("CHFJPY",MODE_BID), 2, NULL, NULL, NULL, 0, 0, CLR_NONE); OrderSend("USDCHF",OP_SELL, Lot, MarketInfo("USDCHF",MODE_BID), 2, NULL, NULL, NULL, 0, 0, CLR_NONE); OrderSend("AUDJPY",OP_SELL, Lot, MarketInfo("AUDJPY",MODE_BID), 2, NULL, NULL, NULL, 0, 0, CLR_NONE); OrderSend("USDJPY",OP_BUY, Lot, MarketInfo("USDJPY",MODE_ASK), 2, NULL, NULL, NULL, 0, 0, CLR_NONE); OrderSend("EURUSD",OP_BUY, Lot, MarketInfo("EURUSD",MODE_ASK), 2, NULL, NULL, NULL, 0, 0, CLR_NONE); OrderSend("EURCHF",OP_BUY, Lot, MarketInfo("EURCHF",MODE_ASK), 2, NULL, NULL, NULL, 0, 0, CLR_NONE); OrderSend("GBPJPY",OP_BUY, Lot, MarketInfo("GBPJPY",MODE_ASK), 2, NULL, NULL, NULL, 0, 0, CLR_NONE); OrderSend("USDCAD",OP_BUY, Lot, MarketInfo("USDCAD",MODE_ASK), 2, NULL, NULL, NULL, 0, 0, CLR_NONE); OrderSend("CADJPY",OP_BUY, Lot, MarketInfo("CADJPY",MODE_ASK), 2, NULL, NULL, NULL, 0, 0, CLR_NONE); OrderSend("AUDUSD",OP_BUY, Lot, MarketInfo("AUDUSD",MODE_ASK), 2, NULL, NULL, NULL, 0, 0, CLR_NONE); if(ticket<0) { Print(":( error while sending order: ",ErrorDescription(GetLastError())); return(0); } else orderSendDay =dayOfMonth; //ticket is OK; no more trading today, now let's modify... needToModify =true; } if(needToModify) //only if OrderSend() was successful { SetSLTP(); //order sl, tp and open price result =OrderModify(ticket,oop,sl,tp,0); if(!result) { Print(":( error while modyfing order: ",ErrorDescription(GetLastError())); return(0); } else needToModify =false; } //---- return(0); } //+------------------------------------------------------------------+ bool IsAVirgin(double myPrice) { if(myPrice > maxSinceInit || myPrice < minSinceInit) return(true); else return(false); } int UpdateMinMax() { if(Bid > maxSinceInit) maxSinceInit =Bid; if(Bid < minSinceInit) minSinceInit =Bid; return; } double GetEntryPrice() { //order entry price if(TypeOfOrder == 0) return(Ask); else if(TypeOfOrder == 1) return(Bid); else return(NormalizeDouble(EntryPrice,Digits)); } void SetSLTP() { OrderSelect(ticket,SELECT_BY_TICKET); oop =OrderOpenPrice(); if(TypeOfOrder%2 == 0) //long { sl =NormalizeDouble(oop - SLDistancePips*Point,Digits); tp =NormalizeDouble(oop + TPDistancePips*Point,Digits); } else //short { sl =NormalizeDouble(oop + SLDistancePips*Point,Digits); tp =NormalizeDouble(oop - TPDistancePips*Point,Digits); } }